/*"setFormData","setDisabled","setFormTxtData","serializeObject"*/
/**
 * @widoc $.fn.setFormData
 * @namespace aux
 * @des 将当前元素中定义了 name 的元素根据 jsonValue 赋值
 * 支持文本框、文本域、单选框、复选框（数组或以“;”分隔的字符串）、下拉框
 * 注：jsonValue 中未指定的数据不会更改，即如需清空，需要指定所有 name 并赋空值''
 * @type function
 * @param {object} jsonValue 以 name-val 键值对形式保存的元素值，name 对应表单元素的 name
 */
$.fn.setFormData=function(jsonValue){
    var el = $(this),
        jqControl,type;// 表单元素，表单元素的 type
    $.each(jsonValue, function(name, ival){
        jqControl = el.find("[name=" + name + "]");
        type=jqControl.attr("type");
        if(typeof ival!='undefined'){
            if(type=='checkbox'){
                jqControl.prop('checked',false);// 取消所有选中
                if(typeof ival=='string'){
                    ival=ival.split(';');
                }
                for(var i= 0,len=ival.length;i<len;i++){
                    jqControl.filter('[value="'+ ival[i] +'"]').prop('checked',true);
                }
            }else if(type=='radio'){
                jqControl.prop('checked',false);
                jqControl.filter('[value="'+ ival +'"]').prop('checked',true);
            }else{
                jqControl.val(ival);
            }
        }
    })
};
/**
 * @widoc $.fn.setDisabled
 * @namespace aux
 * @des 将当前元素中的 input、textarea、select、button 设为只读
 * @type function
 * @param {boolean=} disabled 是否设为 disabled，默认为 true
 */
$.fn.setDisabled=function(disabled){
    var el=$(this);
    disabled = disabled!==false;
    el.find('input,textarea,select,button').prop('disabled',disabled);
};
/**
 * @widoc $.fn.setFormTxtData
 * @namespace aux
 * @des 将当前元素中定义了 name 的元素根据 jsonValue 填充（.html(...)）
 * 将覆盖对应 name 的子元素的内容
 * 注：jsonValue 中未指定的数据不会更改，即如需清空，需要指定所有 name 并赋空值 ''
 * @type function
 * @param {object} jsonValue 以 name-val 键值对形式保存的元素值
 */
$.fn.setFormTxtData=function(jsonValue){
    var el = $(this);
    $.each(jsonValue, function(name, ival){
        el.find("[name=" + name + "]").html(ival);
    });
};
/**
 * @widoc $.fn.serializeObject
 * @namespace aux
 * @des 获取元素中定义了 name 属性的 input、textarea、select 元素的 value。其中若文本框元素上，定义了 data-notrim 属性，则取值时会保留前后空格。
 * @return {Object} obj 返回对象 键值对name-value
 */
$.fn.serializeObject=function(){
    var el=$(this),
        oRes = {};
    var jq,name,type,val,
        jqIpts=el.find('[name]');// 只处理有 name 属性的元素
    // input
    $.each(jqIpts.filter('input'),function(){
        jq=$(this);
        name=jq.attr('name');
        type=jq.attr('type');
        val=jq.val();
        if(type=="checkbox"){
            // 复选框 - 数组形式，无选中项不添加到结果中
            if(jq.prop('checked')){
                if (oRes[name]== undefined){
                    oRes[name]=[];
                }
                oRes[name].push(val);
            }
        }else if(type=="radio"){
            // 单选框
            if(jq.prop('checked')){
                oRes[name]=val;
            }
        }else if(type=='text' || typeof type=='undefined'){
            // 文本框 - 若定义了 data-notrim 属性，则会保留前后空格
            oRes[name] = typeof jq.attr('data-notrim')=='undefined' ?
                val.trim() :
                val;
        }else{
            // 普通文本域、日期框组件
            oRes[name]=val;
        }
    });
    // textarea
    $.each(jqIpts.filter('textarea'),function(){
        jq=$(this);
        oRes[jq.attr('name')]=jq.val();
    });
    // select
    $.each(jqIpts.filter('select'),function(){
        jq=$(this);
        oRes[jq.attr('name')]=jq.val();
    });
    return oRes;
};